/**
 * parser - jQuery EasyUI
 * 
 * Licensed under the GPL terms To use it on other terms please contact us
 * 
 * Copyright(c) 2009-2012 stworthy [ stworthy@gmail.com ]
 * 
 */

(function($) {
	$.parser = {
		auto : true,
		onComplete : function(context) {
		},
		plugins : ['draggable', 'droppable', 'resizable', 'pagination',
				'linkbutton', 'menu', 'menubutton', 'splitbutton',
				'progressbar', 'tree', 'combobox', 'combotree', 'combogrid',
				'numberbox', 'validatebox', 'searchbox', 'numberspinner',
				'timespinner', 'calendar', 'datebox', 'datetimebox', 'slider',
				'layout', 'panel', 'datagrid', 'propertygrid', 'treegrid',
				'tabs', 'accordion', 'window', 'dialog'],
		parse : function(context) {
			var aa = [];
			for (var i = 0; i < $.parser.plugins.length; i++) {
				var name = $.parser.plugins[i];
				var r = $('.easyui-' + name, context);
				if (r.length) {
					if (r[name]) {
						r[name]();
					} else {
						aa.push({
									name : name,
									jq : r
								});
					}
				}
			}
			if (aa.length && window.easyloader) {
				var names = [];
				for (var i = 0; i < aa.length; i++) {
					names.push(aa[i].name);
				}
				easyloader.load(names, function() {
							for (var i = 0; i < aa.length; i++) {
								var name = aa[i].name;
								var jq = aa[i].jq;
								jq[name]();
							}
							$.parser.onComplete.call($.parser, context);
						});
			} else {
				$.parser.onComplete.call($.parser, context);
			}
		},

		/**
		 * parse options, including standard 'data-options' attribute.
		 * 
		 * calling examples: $.parser.parseOptions(target);
		 * $.parser.parseOptions(target,
		 * ['id','title','width',{fit:'boolean',border:'boolean'},{min:'number'}]);
		 */
		parseOptions : function(target, properties) {
			var t = $(target);
			var options = {};

			var s = $.trim(t.attr('data-options'));
			if (s) {
				var first = s.substring(0, 1);
				var last = s.substring(s.length - 1, 1);
				if (first != '{')
					s = '{' + s;
				if (last != '}')
					s = s + '}';
				options = (new Function('return ' + s))();
			}

			if (properties) {
				var opts = {};
				for (var i = 0; i < properties.length; i++) {
					var pp = properties[i];
					if (typeof pp == 'string') {
						if (pp == 'width' || pp == 'height' || pp == 'left'
								|| pp == 'top') {
							opts[pp] = parseInt(target.style[pp]) || undefined;
						} else {
							opts[pp] = t.attr(pp);
						}
					} else {
						for (var name in pp) {
							var type = pp[name];
							if (type == 'boolean') {
								opts[name] = t.attr(name)
										? (t.attr(name) == 'true')
										: undefined;
							} else if (type == 'number') {
								opts[name] = t.attr(name) == '0'
										? 0
										: parseFloat(t.attr(name)) || undefined;
							}
						}
					}
				}
				$.extend(options, opts);
			}
			return options;
		}
	};
	$(function() {
				if (!window.easyloader && $.parser.auto) {
					$.parser.parse();
				}
			});

	/**
	 * extend plugin to set box model width
	 */
	$.fn._outerWidth = function(width) {
		if (width == undefined) {
			if (this[0] == window) {
				return this.width() || document.body.clientWidth;
			}
			return this.outerWidth() || 0;
		}
		return this.each(function() {
			if (!$.support.boxModel && $.browser.msie) {
				$(this).width(width);
			} else {
				$(this).width(width - ($(this).outerWidth() - $(this).width()));
			}
		});
	};

	/**
	 * extend plugin to set box model height
	 */
	$.fn._outerHeight = function(height) {
		if (height == undefined) {
			if (this[0] == window) {
				return this.height() || document.body.clientHeight;
			}
			return this.outerHeight() || 0;
		}
		return this.each(function() {
					if (!$.support.boxModel && $.browser.msie) {
						$(this).height(height);
					} else {
						$(this).height(height
								- ($(this).outerHeight() - $(this).height()));
					}
				});
	};

	$.fn._propAttr = $.fn.prop || $.fn.attr;

})(jQuery);
